package com.coder.rental.security;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.security.SecureRandom;

// 配置密码编码器
// 这里测试的时候，在Postman里面使用密码明文，数据库里面使用密文存储
// 其次密文密码前面还要加{bcrypt}，否则会报错id null
// 强散列加密每次运行都会生成新的密文，所以不能使用明文密码，虽然同一明文密码对应的密文不同，但是具有相同的散列数据
@Configuration
@Data
public class PasswordConfig {
    // 强散列加密方式
    // 通过@Value注解从应用的配置文件中动态注入加密强度值。
    @Value("${encoder.ctype.strength}")
    private int strength;
    // 通过@Value注解从应用的配置文件中动态注入加密使用的密钥。
    @Value("${encoder.ctype.secret}")
    private String secret;

    /**
     * 创建并返回一个BCryptPasswordEncoder实例。
     * 此密码编码器使用指定的加密强度和基于secret参数生成的SecureRandom实例。
     *
     * @return BCryptPasswordEncoder 返回一个配置好的BCryptPasswordEncoder实例。
     */
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        // 使用secret生成一个SecureRandom实例，以增加加密过程的随机性。
        SecureRandom secureRandom = new SecureRandom(secret.getBytes());
        return new BCryptPasswordEncoder(strength, secureRandom);
//        return new BCryptPasswordEncoder();
    }

    /*public static void main(String[] args) {
        BCryptPasswordEncoder passwordEncoder = new PasswordConfig().passwordEncoder();
        System.out.println(passwordEncoder.encode("111111"));
    }*/
}
